package com.gper.edu.mytrait

/**
 * 特质也是有构造器的，构造器中的内容由“字段的初始化”和一些其他语句构成
 * 特质构造器的执行顺序：
 * 1. 声明类的同时混入特质
 *    (1) 调用当前类的超类构造器
 *    (2) 第一个特质的父构造器
 *    (3) 第一个特质构造器
 *    (4) 第二个特质的父构造器，如果已经执行过，就不再执行
 *    (5) 第二特质构造器
 *       .....如果有更多特质，重复4，5步骤
 *    (6) 调用当前类的构造器
 * 2. 创建类的对象时混入特质
 *    (1) 调用当前类的超类构造器
 *    (2) 调用当前类的构造器
 *    (3) 第一个特质的父构造器
 *    (4) 第一个特质构造器
 *    (5) 第二个特质的父构造器，如果已经执行过，就不再执行
 *    (6) 第二特质构造器
 *       .....如果有更多特质，重复4，5步骤
 */
object TraitConstructDemo {

  def main(args: Array[String]): Unit = {
    println("============静态混入特质，构造器的执行顺序==========================")
    val ff = new FF
    println("============动态混入特质，构造器的执行顺序==========================")
    val kk = new GG with CC with DD
  }
}

trait AA{
  println("AA.....")
}

trait BB extends AA{
  println("BB extends AA.....")
}

trait CC extends BB{
  println("CC extends BB.....")
}

trait DD extends BB{
  println("DD extends BB.....")
}

class EE{
  println("EE.....")
}

class FF extends EE with CC with DD{
  println("FF extends EE with CC with DD.....")
}

class GG extends EE{
  println("GG extends EE.....")
}